package veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import veterinaria.excepcion.DAOExcepcion;
import veterinaria.modelo.Producto;
import veterinaria.util.ConexionBD;

public class ProductoDAO extends BaseDAO {

	public Collection<Producto> buscarPorNombre(String pNom) throws DAOExcepcion {
		String sqlDoc="Select ProCodigo,ProNombre,ProPrecio From MProducto Where ProNombre Like ?";
		Collection<Producto> lisDoc=new ArrayList<Producto>();
		Connection conDoc=null;
		PreparedStatement comDoc=null;
		ResultSet rstDoc=null;
		try {
			conDoc=ConexionBD.obtenerConexion();
			comDoc=conDoc.prepareStatement(sqlDoc);
			comDoc.setString(1, "%" + pNom + "%");
			rstDoc=comDoc.executeQuery();
			while (rstDoc.next()) {
				Producto regDoc = new Producto();
				regDoc.setProCodigo(rstDoc.getInt("ProCodigo"));
				regDoc.setProNombre(rstDoc.getString("ProNombre"));
				lisDoc.add(regDoc);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
			
		} finally {
			this.cerrarResultSet(rstDoc);
			this.cerrarStatement(comDoc);
			this.cerrarConexion(conDoc);
		}
		System.out.println(lisDoc.size());
		return lisDoc;
	}

	public Producto insertar(Producto pReg) throws DAOExcepcion {
		String cSql = "Insert Into MProducto(ProNombre) Values (?)";
		Connection cCon = null;
		PreparedStatement cCom = null;
		ResultSet cRst = null;
		try {
			cCon = ConexionBD.obtenerConexion();
			cCom = cCon.prepareStatement(cSql);
			cCom.setString(1, pReg.getProNombre());
			int nroErr = cCom.executeUpdate();
			if (nroErr != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int newCod = 0;
			cSql="Select Last_Insert_id()";
			cCom=cCon.prepareStatement(cSql);
			cRst=cCom.executeQuery();
			if (cRst.next()) {
				newCod=cRst.getInt(1);
			}
			pReg.setProCodigo(newCod);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(cRst);
			this.cerrarStatement(cCom);
			this.cerrarConexion(cCon);
		}
		return pReg;
	}

	public Producto obtener(int pCod) throws DAOExcepcion {
		Producto cReg = new Producto();
		Connection cCon = null;
		PreparedStatement cCom = null;
		ResultSet cRst = null;
		try {
			String query = "Select ProCodigo, ProNombre From MProducto Where ProCodigo=?";
			cCon=ConexionBD.obtenerConexion();
			cCom=cCon.prepareStatement(query);
			cCom.setInt(1, pCod);
			cRst=cCom.executeQuery();
			if (cRst.next()) {
				cReg.setProCodigo(cRst.getInt(1));
				cReg.setProNombre(cRst.getString(2));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(cRst);
			this.cerrarStatement(cCom);
			this.cerrarConexion(cCon);
		}
		return cReg;
	}

	public void eliminar(int idProducto) throws DAOExcepcion {
		String cSql="Delete From MProducto Where ProCodigo=?";
		Connection cCon=null;
		PreparedStatement cCom=null;
		try {
			cCon=ConexionBD.obtenerConexion();
			cCom=cCon.prepareStatement(cSql);
			cCom.setInt(1, idProducto);
			int i = cCom.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(cCom);
			this.cerrarConexion(cCon);
		}
	}

	public Producto actualizar(Producto pReg) throws DAOExcepcion {
		String cSql="UpDate MProducto Set ProNombre=? Where ProCodigo=?";
		Connection cCon=null;
		PreparedStatement cCom=null;
		try {
			cCon=ConexionBD.obtenerConexion();
			cCom=cCon.prepareStatement(cSql);
			cCom.setString(1, pReg.getProNombre());
			cCom.setInt(2, pReg.getProCodigo());			
			int i = cCom.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(cCom);
			this.cerrarConexion(cCon);
		}
		return pReg;
	}

	
	public Collection<Producto> listar() throws DAOExcepcion {
		Collection<Producto> c = new ArrayList<Producto>();
		Connection cCon=null;
		PreparedStatement cCom=null;
		ResultSet cRst=null;
		try {
			cCon = ConexionBD.obtenerConexion();
			String cSql="Select ProCodigo,ProNombre From MProducto Order By ProNombre";
			cCom=cCon.prepareStatement(cSql);
			cRst=cCom.executeQuery();
			while (cRst.next()) {
				Producto cReg = new Producto();
				cReg.setProCodigo(cRst.getInt("ProCodigo"));
				cReg.setProNombre(cRst.getString("ProNombre"));
				c.add(cReg);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(cRst);
			this.cerrarStatement(cCom);
			this.cerrarConexion(cCon);
		}
		return c;
	}
}
